<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>原型&原型链</title>
  </head>
  <body>
    <script>
      /*
        1. 原型指的是啥
        2. 两个原型属性：哪里有这个原型属性，它的值又是什么
        3. 特殊情况

        原型指的是两个原型属性：prototype 和 __proto__
        为了更好描述它们，prototype 也叫显示原型属性，__proto__ 就是隐式原型属性。

        所有函数都有显示原型属性（箭头函数没有），显示原型属性的值指向一个对象，我们也叫原型对象
        原型对象上有一个constructor方法，指向函数本身，还有一个隐式原型属性，指向Object的原型对象

        所有对象都有隐式原型属性，它的值指向其构造函数显示原型属性的值

        Function.__proto__ === Function.prototype
        Object.prototype.__proto__ === null （原型链的尽头）
      */

      /*
        原型链：
          1. 概念：由多个隐式原型属性组成的结构
          2. 作用：对象查找属性/方法
          3. 具体：
            先在自身属性上找，找不到沿着隐式原型属性找，找到就返回值，最终会来到 Object.prototype.__proto__ 
            此时就找不到，返回值是undefined


        应用：
          class&extend继承
          Vue的全局事件总线：Vue.prototype.$bus = this  
          汇总所有api接口函数到一个对象上：Vue.prototype.$api = xxx
            this.$api.trademark.getTrademarkList()
      */

      function fn() {}
      console.log(fn.prototype);
      console.log(fn.prototype.__proto__ === Object.prototype);
    </script>
  </body>
</html>
